.\" $Id: lmdd.8 1.1 94/11/18 01:26:35-08:00 lm@lm.bitmover.com $
.TH LMDD 8 "$Date: 94/11/18 01:26:35-08:00 $" "(c)1994 Larry McVoy" "LMBENCH"
.SH NAME
lmdd \- move io for performance and debugging tests
.SH SYNOPSIS
.B lmdd
[
.IB option = value
] .\|.\|.
.SH DESCRIPTION
.B lmdd
copies a specified input file to a specified output with possible
conversions.  This program is primarily useful for timing I/O since it
prints out the timing statistics after completing.
.SH OPTIONS
.TP 15
.BI if= name
Input file is taken from
.IR name ;
.I internal
is the default.
.I internal
is a special file that acts like Sun's 
.IR /dev/zero ,
i.e., it provides a buffer of zeros without doing a system call to get them.
.sp .5
The following file names are taken to mean the standard input:
.IR - ,
.IR 0 ,
or
.IR stdin .
.TP 
.BI of= name
Output file is taken from
.IR name ;
.I internal
is the default.
.I internal
is a special file that acts like 
.IR /dev/null ,
without doing a system call to get rid of the data.
.sp .5
The following file names are taken to mean the standard output:
.IR - ,
.IR 1 ,
or
.IR stdout .
.sp .5
The following file names are taken to mean the standard error:
.IR 2 ,
or
.IR stderr .
.TP 
.BI bs= n
Input and output block size
.I n
bytes (default 8192).  Note that this is different from dd(1), it has
a 512 byte default.   Also note that the block size can be followed
by 'k' or 'm' to indicate kilo bytes (*1024) or megabytes (*1024*1024),
respectively.
.TP 
.BI ipat= n
If 
.B n
is non zero, expect a known pattern in the file (see opat).  Mismatches
will be displayed as "ERROR: off=%d want=%x got=%x".  The pattern is
a sequence of 4 byte integers with the first 0, second 1, and so on.
The default is not to check for the pattern.
.TP
.BI opat= n
If 
.B n
is non zero, generate a known pattern on the output stream.  Used for
debugging file system correctness.
The default is not to generate the pattern.
.TP 
.BI mismatch= n
If 
.B n
is non zero, stop at the first mismatched value.  Used with ipat.
.TP 
.BI skip= n
Skip
.IR n ""
input blocks before starting copy.
.TP 
.BI fsync= n
If
.I n
is non-zero, call fsync(2) on the output file before exiting or printing
timing statistics.
.TP 
.BI sync= n
If
.I n
is non-zero, call sync(2) before exiting or printing
timing statistics.
.TP 
.BI rand= n
This argument, by default off, turns on random behavior.  The argument is
not a flag, it is a size, that size is used as the upper bound for the 
seeks.
Also note that the block size can be followed
by 'k' or 'm' to indicate kilo bytes (*1024) or megabytes (*1024*1024),
.TP 
.BI flush= n
If
.I n
is non-zero and mmap(2) is available, call msync(2) to invalidate the
output file.  This flushes the file to disk so that you don't have
unmount/mount.  It is not as good as mount/unmount because it just
flushes file pages - it misses the indirect blocks which are still
cached.  Not supported on all systems, compile time option.
.TP 
.BI rusage= n
If
.I n
is non-zero, print rusage statistics as well as timing statistics.
Not supported on all systems, compile time option.
.TP 
.BI count= n
Copy only
.IR n ""
input records.
.SH EXAMPLES
.LP
This is the most common usage, the intent is to measure disk performance.
The disk is a spare partition mounted on /spare.
.sp
.nf
.in +4
# mount /spare
# lmdd if=internal of=/spare/XXX count=1000 fsync=1
7.81 MB in 3.78 seconds (2.0676 MB/sec)

: Flush cache
# umount /spare
# mount /spare

# lmdd if=/spare/XXX of=internal 
7.81 MB in 2.83 seconds (2.7611 MB/sec)
.in
.sp
.fi
.SH AUTHOR
Larry McVoy, lm@sun.com
